//
// Singly Linked List
// Created by Win10 on 2022/10/16.
//

#ifndef C_DATA_STRUCTURE_SL_LIST_H
#define C_DATA_STRUCTURE_SL_LIST_H

typedef struct LNode {
    int data;
    struct LNode *next;
} LNode, *LinkList;
//struct LNode*  == LinkList
//强调节点  用LNode
//强调链表  用LinkList

//按位查找，返回第i个元素（带头节点）
LNode *GetElem(LinkList L, int i);

//按值查找，找到数据域等于e的节点
LNode *LocateElem(LinkList L, int e);

//统计单链表的长度
int Length(LinkList L);

//后插操作，在节点p之后插入元素e
bool InsertNextNode(LNode *p, int e);

//带头节点的插入操作，在第i个位置插入元素e
bool ListInsert(LinkList &L, int i, int e);

//不带头节点的插入操作，在第i个位置插入元素e
bool NoHead_ListInsert(LinkList &L, int i, int e);

//前插操作，在p节点前插入元素e
bool InsertPriorNode(LNode *p, int e);

//前插操作，在节点p之前插入节点s
bool InsertPriorNode(LNode *p, LNode *s);

//删除位序i的节点，e是i节点的值
bool ListDelete(LinkList &L, int i, int &e);

//删除指定节点P
bool DeleteNode(LNode *p);

bool InitList(LinkList &L);

//尾插法，带头结点
LinkList List_TailInsert(LinkList &L);

//头插法，带头结点
LinkList List_HeadInsert(LinkList &L);

void print(LinkList L);

#endif //C_DATA_STRUCTURE_SL_LIST_H
